package cn.tedu.suppermemory.service.impl;

import cn.tedu.suppermemory.ex.ServiceException;
import cn.tedu.suppermemory.mapper.PermissionMapper;
import cn.tedu.suppermemory.mapper.RoleMapper;
import cn.tedu.suppermemory.mapper.RolePermissionMapper;
import cn.tedu.suppermemory.pojo.dto.PermissionAddNewDTO;
import cn.tedu.suppermemory.pojo.dto.PermissionUpdateDTO;
import cn.tedu.suppermemory.pojo.dto.RolePermissionAddNewDTO;
import cn.tedu.suppermemory.pojo.entity.Permission;
import cn.tedu.suppermemory.pojo.entity.RolePermission;
import cn.tedu.suppermemory.pojo.vo.*;
import cn.tedu.suppermemory.service.IPermissionService;
import cn.tedu.suppermemory.service.IRolePermissionService;
import cn.tedu.suppermemory.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Iterator;
import java.util.List;

@Slf4j
@Service
public class RolePermissionServiceImpl implements IRolePermissionService {

    @Autowired
    private IRolePermissionService rolePermissionService;
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private PermissionMapper permissionMapper;
    @Autowired
    private RolePermissionMapper rolePermissionMapper;

    /**
     * 添加角色权限
     *
     * @param rolePermissionAddNewDTO 角色权限数据
     */
    @Override
    public void addNew(RolePermissionAddNewDTO rolePermissionAddNewDTO) {

        log.debug("开始处理【添加角色权限】的业务，参数：{}", rolePermissionAddNewDTO);

        // 检查该角色id在角色表中是否存在 不存在，抛出异常
        Long roleId = rolePermissionAddNewDTO.getRoleId();
        RoleStandardVO roleStandardById = roleMapper.getStandardById(roleId);
        if (roleStandardById == null) {
            // 不存在该角色id，抛出异常
            String message = "该角色id在角色表中不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 检查权限表中是否存在该权限 不存在，抛出异常
        Long permissionId = rolePermissionAddNewDTO.getPermissionId();
        PermissionStandardVO permissionStandardById = permissionMapper.getStandardById(permissionId);
        if (permissionStandardById == null) {
            // 不存在该权限id，抛出异常
            String message = "该权限id在权限表中不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 检查该角色在角色权限表中是否存在
        // 若存在该角色id， 还需查询该角色id的权限id是否已存在，若存在该角色id的权限id，抛出异常  没有该角色id的权限id，则可以添加
        // 若不存在该角色id，则可以直接添加
        int countByRoleId = rolePermissionMapper.countByRoleId(roleId);
        if (countByRoleId >=1 ) {
            // 对该角色id的权限id进行查询
            int countByRoleIdAndPermissionId = rolePermissionMapper.countByRoleIdAndPermissionId(roleId, permissionId);
            if (countByRoleIdAndPermissionId >= 1) {
                String message = "该角色id中已存在该权限id！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建RolePermission对象
        RolePermission rolePermission = new RolePermission();
        BeanUtils.copyProperties(rolePermissionAddNewDTO,rolePermission);
        log.info("即将进行数据插入！");
        int insert = rolePermissionMapper.insert(rolePermission);
        if (insert == 0) {
            String message = "添加数据失败，服务器忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    /**
     * 删除角色权限
     *
     * @param id 角色权限id
     */
    @Override
    public void delete(Long id) {
        log.info("开始处理【根据id删除角色权限数据】的业务，参数：{}", id);
        // 检查尝试删除的数据是否存在
        RolePermissionStandardVO standardById = rolePermissionMapper.getStandardById(id);
        if (standardById == null) {
            String message = " 删除角色权限数据失败，尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        log.info("开始执行删除数据：参数：id={}", id);
        int rows = rolePermissionMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除数据失败！服务器忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }


    /**
     * 查询角色权限列表数据
     *
     * @return List<RolePermissionListItemVO> 角色权限列表
     */
    @Override
    public List<RolePermissionListItemVO> list() {
        log.info("开始处理【查询角色权限】的业务，无参数！");
        List<RolePermissionListItemVO> list = rolePermissionMapper.list();

        for (RolePermissionListItemVO item : list) {
            log.info("增强型for循环：查询结果：【{}】", item);
        }

        // 另一种迭代器进行循环
//        Iterator<RolePermissionListItemVO> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            RolePermissionListItemVO rolePermissionListItemVO = iterator.next();
//            log.info("角色权限数据：{}", rolePermissionListItemVO);
//        }

        return list;
    }
}
